package com.xyht.sca_s.student_manage_system.modules.visitor.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xyht.sca_s.student_manage_system.common.commonReturn.CommonCodeEnum;
import com.xyht.sca_s.student_manage_system.common.commonReturn.CommonResult;
import com.xyht.sca_s.student_manage_system.common.commonReturn.ResponseResult;
import com.xyht.sca_s.student_manage_system.common.util.CacheUtil;
import com.xyht.sca_s.student_manage_system.common.util.TimeUtil;
import com.xyht.sca_s.student_manage_system.modules.newTips.myEnum.AppTypeEnum;
import com.xyht.sca_s.student_manage_system.modules.newTips.myEnum.RangeTypeEnum;
import com.xyht.sca_s.student_manage_system.modules.newTips.myEnum.TipsTypeEnum;
import com.xyht.sca_s.student_manage_system.modules.newTips.util.NewTipsUtil;
import com.xyht.sca_s.student_manage_system.modules.qr.mapper.SmsQrMapper;
import com.xyht.sca_s.student_manage_system.modules.user.entity.SmsRole;
import com.xyht.sca_s.student_manage_system.modules.user.entity.SmsUser;
import com.xyht.sca_s.student_manage_system.modules.user.mapper.SmsRoleMapper;
import com.xyht.sca_s.student_manage_system.modules.user.mapper.SmsUserMapper;
import com.xyht.sca_s.student_manage_system.modules.visitor.entity.SmsVisitorRegister;
import com.xyht.sca_s.student_manage_system.modules.visitor.entity.SmsVisitorRegisterDetail;
import com.xyht.sca_s.student_manage_system.modules.visitor.entity.SmsVisitorUser;
import com.xyht.sca_s.student_manage_system.modules.visitor.entity.dto.*;
import com.xyht.sca_s.student_manage_system.modules.visitor.entity.vo.SmsVisitorAllowVO;
import com.xyht.sca_s.student_manage_system.modules.visitor.entity.vo.SmsVisitorProcessVO;
import com.xyht.sca_s.student_manage_system.modules.visitor.entity.vo.SmsVisitorRegisterVO;
import com.xyht.sca_s.student_manage_system.modules.visitor.mapper.SmsVisitorProcessMapper;
import com.xyht.sca_s.student_manage_system.modules.visitor.mapper.SmsVisitorRegisterDetailMapper;
import com.xyht.sca_s.student_manage_system.modules.visitor.mapper.SmsVisitorRegisterMapper;
import com.xyht.sca_s.student_manage_system.modules.visitor.mapper.SmsVisitorUserMapper;
import com.xyht.sca_s.student_manage_system.modules.visitor.service.SmsVisitorRegisterService;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

import static com.xyht.sca_s.student_manage_system.common.util.ParamCheckUtil.isNullOrEmpty;
import static com.xyht.sca_s.student_manage_system.modules.visitor.contact.AllowState.ALLOW_REGISTER_PROCESS_LOSS;
import static com.xyht.sca_s.student_manage_system.modules.visitor.contact.AllowState.ALLOW_REGISTER_PROCESS_SUCESS;
import static com.xyht.sca_s.student_manage_system.modules.visitor.contact.CheckType.PROCESS_PEOPLE_CHECK_TYPE;
import static com.xyht.sca_s.student_manage_system.modules.visitor.contact.CheckType.PROCESS_ROLE_CHECK_TYPE;
import static com.xyht.sca_s.student_manage_system.modules.visitor.contact.QrState.QR_USED;
import static com.xyht.sca_s.student_manage_system.modules.visitor.contact.State.*;


/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author XYHT
 * @since 2023-04-16
 */
@Service
public class SmsVisitorRegisterServiceImpl extends ServiceImpl<SmsVisitorRegisterMapper, SmsVisitorRegister> implements SmsVisitorRegisterService {
    @Autowired
    SmsQrMapper smsQrMapper;
    @Autowired
    SmsVisitorRegisterMapper smsVisitorRegisterMapper;
    @Autowired
    SmsVisitorProcessMapper smsVisitorProcessMapper;
    @Autowired
    SmsVisitorRegisterDetailMapper smsVisitorRegisterDetailMapper;
    @Autowired
    SmsUserMapper smsUserMapper;
    @Autowired
    SmsRoleMapper smsRoleMapper;
    @Autowired
    CacheUtil cacheUtil;
    @Autowired
    SmsVisitorUserMapper smsVisitorUserMapper;
    @Autowired
    private NewTipsUtil newTipsUtil;
    @Override
    @Transactional//添加事务
    public ResponseResult smsVisitorRegisterAdd(SmsVisitorRegisterVO smsVisitorRegisterVO,String user_id) {
        if (isNullOrEmpty(smsVisitorRegisterVO.getVisitorName()) || isNullOrEmpty(smsVisitorRegisterVO.getVisitorPhone()
        ) || isNullOrEmpty(smsVisitorRegisterVO.getVisitorCardNum()) || isNullOrEmpty(smsVisitorRegisterVO.getVisitorType()) ||
                isNullOrEmpty(smsVisitorRegisterVO.getInterviewerName()) || isNullOrEmpty(smsVisitorRegisterVO
                .getInterviewerPhone())||isNullOrEmpty(smsVisitorRegisterVO.getInterviewerId())) {
            return CommonResult.failed(CommonCodeEnum.INVALID_PARAM);
        }
        SmsVisitorUser smsVisitorU = smsVisitorUserMapper.selectById(user_id);
        if(isNullOrEmpty(smsVisitorU)){
            return CommonResult.failed(CommonCodeEnum.DATA_NOT_FOUND);
        }
        SmsVisitorRegister smsVisitorRegister = new SmsVisitorRegister();
        smsVisitorRegister.setUserId(user_id);
        smsVisitorRegister.setBgTime(smsVisitorRegisterVO.getBgTime());
        smsVisitorRegister.setEndTime(smsVisitorRegisterVO.getEndTime());
        smsVisitorRegister.setVisitorName(smsVisitorRegisterVO.getVisitorName());
        smsVisitorRegister.setVisitorEnterprise(smsVisitorRegisterVO.getVisitorEnterprise());
        smsVisitorRegister.setVisitorCarNum(smsVisitorRegisterVO.getVisitorCarNum());
        smsVisitorRegister.setVisitorCause(smsVisitorRegisterVO.getVisitorCause());
        smsVisitorRegister.setVisitorCardNum(smsVisitorRegisterVO.getVisitorCardNum());
        smsVisitorRegister.setVisitorPhone(smsVisitorRegisterVO.getVisitorPhone());
        smsVisitorRegister.setVisitorType(smsVisitorRegisterVO.getVisitorType());
        smsVisitorRegister.setInterviewerName(smsVisitorRegisterVO.getInterviewerName());
        smsVisitorRegister.setRegisterState(smsVisitorRegisterVO.getRegisterState());
        smsVisitorRegister.setInterviewerPhone(smsVisitorRegisterVO.getInterviewerPhone());
        //smsVisitorRegister.setQrId(smsQr.getId());
        smsVisitorRegisterMapper.insert(smsVisitorRegister);
        String registerId = smsVisitorRegister.getId();
        //创建审批流程

            SmsVisitorRegisterDetail smsVisitorRegisterDetail = new SmsVisitorRegisterDetail();
            smsVisitorRegisterDetail.setCheckId(smsVisitorRegisterVO.getInterviewerId());
            smsVisitorRegisterDetail.setCheckType(PROCESS_PEOPLE_CHECK_TYPE);
            smsVisitorRegisterDetail.setSort(1);
            smsVisitorRegisterDetail.setRegisterId(smsVisitorRegister.getId());
            smsVisitorRegisterDetail.setVisitorState(VISITOR_REGISTER_PROCESS_LOOKING);
            smsVisitorRegisterDetailMapper.insert(smsVisitorRegisterDetail);

//        //消息通知


        SmsVisitorRegisterDetail firstDetail =
                smsVisitorRegisterDetailMapper.selectOne(new QueryWrapper<SmsVisitorRegisterDetail>()
                        .lambda()
                        .eq(SmsVisitorRegisterDetail::getRegisterId, registerId)
                        .eq(SmsVisitorRegisterDetail::getSort, 1)
                        .orderByAsc(SmsVisitorRegisterDetail::getSort));
        RangeTypeEnum rangeTypeEnum;
        if (firstDetail.getCheckType() == PROCESS_PEOPLE_CHECK_TYPE) {
            rangeTypeEnum = RangeTypeEnum.RANGE_TYPE_ENUM_PERSON;
        } else {
            rangeTypeEnum = RangeTypeEnum.RANGE_TYPE_ENUM_ROLE;
        }
        List<String> rangeList = new ArrayList<>();
        rangeList.add(firstDetail.getCheckId());

        newTipsUtil.addNewTips(TipsTypeEnum.TIPS_TYPE_ENUM_ALLOW,
                user_id,
                rangeTypeEnum,
                rangeList,
                AppTypeEnum.APP_TYPE_ENUM_VISITOR_APPLICATION_ALLOW,
                registerId,
                firstDetail.getId());
        return CommonResult.success();
//        RangeTypeEnum rangeTypeEnum=RangeTypeEnum.RANGE_TYPE_ENUM_PERSON;
//
//        List<String> range_id_list = new ArrayList<>();
//        range_id_list.add(smsVisitorRegisterVO.getInterviewerId());
//        newTipsUtil.addNewTips(TipsTypeEnum.TIPS_TYPE_ENUM_ALLOW,
//                user_id,
//                rangeTypeEnum,
//                range_id_list,
//                AppTypeEnum.APP_TYPE_ENUM_VISITOR_APPLICATION_ALLOW,
//                smsVisitorRegister.getId()
//        );
//
//        return CommonResult.success();
    }

    @Override
    public ResponseResult deleteSmsVisitorRegister(SmsVisitorRegisterVO smsVisitorRegisterVO) {
        if (isNullOrEmpty(smsVisitorRegisterVO.getId())) {
            return CommonResult.failed(CommonCodeEnum.INVALID_PARAM);
        }
        SmsVisitorRegister query = smsVisitorRegisterMapper.selectById(smsVisitorRegisterVO.getId());
        if (isNullOrEmpty(query)) {
            return CommonResult.failed(CommonCodeEnum.DATA_NOT_FOUND);
        }
        smsVisitorRegisterMapper.deleteById(smsVisitorRegisterVO.getId());
        return CommonResult.success();
    }

    @Override
    public ResponseResult updateSmsVisitorRegister(SmsVisitorRegisterVO smsVisitorRegisterVO) {
        if (isNullOrEmpty(smsVisitorRegisterVO)) {
            return CommonResult.failed(CommonCodeEnum.INVALID_PARAM);
        }
        SmsVisitorRegister query = smsVisitorRegisterMapper.selectById(smsVisitorRegisterVO);
        if (query == null) {
            return CommonResult.failed(CommonCodeEnum.DATA_NOT_FOUND);
        }
        SmsVisitorRegister smsVisitorRegister = new SmsVisitorRegister();
        BeanUtils.copyProperties(smsVisitorRegisterVO, smsVisitorRegister);
        smsVisitorRegisterMapper.updateById(smsVisitorRegister);
        return CommonResult.success();
    }

    @Override
    public ResponseResult selectSmsVisitorRegister(String visitor_id, Integer register_state, Integer pageSize, Integer pageNum, String bg_date, String end_date) {
        Date bgDate = null;
        Date endDate = null;
        if (!isNullOrEmpty(bg_date)) {
            bgDate = TimeUtil.StringtoDate(bg_date);
        }
        if (!isNullOrEmpty(end_date)) {
            endDate = TimeUtil.StringtoDate(end_date);

        }
        QueryWrapper<SmsVisitorRegister> queryWrapper = new QueryWrapper<>();
        queryWrapper.lambda().eq(SmsVisitorRegister::getUserId, visitor_id);
        if (isNullOrEmpty(queryWrapper)) {
            return CommonResult.failed(CommonCodeEnum.DATA_NOT_FOUND);
        }
        if (bgDate != null) {
            queryWrapper.lambda().ge(SmsVisitorRegister::getCreateTime, bgDate);
        }
        if (endDate != null) {
            queryWrapper.lambda().le(SmsVisitorRegister::getCreateTime, endDate);
        }
        if (!isNullOrEmpty(register_state)) {
            queryWrapper.lambda().eq(SmsVisitorRegister::getRegisterState, register_state);
        }


        queryWrapper.orderByDesc("create_time");
        Page<SmsVisitorRegister> page = new Page<>(pageNum, pageSize);

        smsVisitorRegisterMapper.selectPage(page, queryWrapper);

        List<SmsVisitorRegister> list = page.getRecords();
        List<SmsVisitorRegisterDTO> registerDTOList = new ArrayList<>();
        if (!isNullOrEmpty(list) && list.size() > 0) {
            for (SmsVisitorRegister register : list) {
                QueryWrapper<SmsVisitorRegisterDetail> queryWrapper1 = new QueryWrapper<>();
                queryWrapper1.lambda().eq(SmsVisitorRegisterDetail::getRegisterId, register.getId());
                List<SmsVisitorRegisterDetail> list1 = smsVisitorRegisterDetailMapper.selectList(queryWrapper1);
                List<SmsVisitorRegisterDetailDTO> detailDTOList = new ArrayList<>();
                if (!isNullOrEmpty(list1) && list1.size() > 0) {
                    for (SmsVisitorRegisterDetail registerDetail : list1) {
                        SmsVisitorRegisterDetailDTO smsVisitorRegisterDetailDTO = new SmsVisitorRegisterDetailDTO();
                        smsVisitorRegisterDetailDTO.setVisitorState(registerDetail.getVisitorState());
                        smsVisitorRegisterDetailDTO.setSort(registerDetail.getSort());
                            QueryWrapper<SmsUser> query = new QueryWrapper<>();
                            query.lambda().eq(SmsUser::getId,registerDetail.getCheckId());
                            SmsUser smsUser = smsUserMapper.selectById(registerDetail.getCheckId());
                            if(!isNullOrEmpty(smsUser)){
                                smsVisitorRegisterDetailDTO.setPicHead(smsUser.getUserPic());
                                smsVisitorRegisterDetailDTO.setAllowerName(smsUser.getRealName());
                            }
                        detailDTOList.add(smsVisitorRegisterDetailDTO);
                    }
                }
                SmsVisitorRegisterDTO smsVisitorRegisterDTO = new SmsVisitorRegisterDTO();
                BeanUtils.copyProperties(register, smsVisitorRegisterDTO);
                smsVisitorRegisterDTO.setDetailList(detailDTOList);
                registerDTOList.add(smsVisitorRegisterDTO);
            }
        }
        int total = (int) page.getTotal();
        return CommonResult.success(registerDTOList, total);

    }
    @ApiOperation("教师根据id查询游客申请")
    @Override
    public ResponseResult selectByIdTeacher(String id, Integer pageSize, Integer pageNum) {

        QueryWrapper<SmsVisitorRegisterDetail> queryWrapper1 = new QueryWrapper<>();
        SmsVisitorRegister register = smsVisitorRegisterMapper.selectById(id);
        if (isNullOrEmpty(register)) {
            return CommonResult.failed(CommonCodeEnum.DATA_NOT_FOUND);
        }
        SmsVisitorRegisterDTO smsVisitorRegisterDTO = new SmsVisitorRegisterDTO();
        queryWrapper1.lambda().eq(SmsVisitorRegisterDetail::getRegisterId, register.getId());
        List<SmsVisitorRegisterDetail> list1 = smsVisitorRegisterDetailMapper.selectList(queryWrapper1);
        List<SmsVisitorRegisterDetailDTO> detailDTOList = new ArrayList<>();
        if (!isNullOrEmpty(list1) && list1.size() > 0) {
            for (SmsVisitorRegisterDetail registerDetail : list1) {
                SmsVisitorRegisterDetailDTO smsVisitorRegisterDetailDTO = new SmsVisitorRegisterDetailDTO();
                BeanUtils.copyProperties(registerDetail,smsVisitorRegisterDetailDTO);
                smsVisitorRegisterDetailDTO.setVisitorState(registerDetail.getVisitorState());
                smsVisitorRegisterDetailDTO.setSort(registerDetail.getSort());

                if (registerDetail.getVisitorState() != VISITOR_REGISTER_PROCESS_LOOKING) {
                    SmsUser smsUser = smsUserMapper.selectById(registerDetail.getAllowerId());
                    smsVisitorRegisterDetailDTO.setPicHead(smsUser.getUserPic());
                    smsVisitorRegisterDetailDTO.setAllowerName(smsUser.getRealName());

                }
                if (registerDetail.getCheckType() == PROCESS_ROLE_CHECK_TYPE) {
                    SmsRole smsRole = smsRoleMapper.selectById(registerDetail.getCheckId());
                    smsVisitorRegisterDetailDTO.setProcessName(smsRole.getRoleName());
                }


                detailDTOList.add(smsVisitorRegisterDetailDTO);
            }

            BeanUtils.copyProperties(register, smsVisitorRegisterDTO);
            smsVisitorRegisterDTO.setDetailList(detailDTOList);
        }

        return CommonResult.success(smsVisitorRegisterDTO);
    }

    @Override
    public ResponseResult scanQr(SmsVisitorRegisterVO smsVisitorRegisterVO,String scan_user_id) {
        if(isNullOrEmpty(smsVisitorRegisterVO.getQrId())){
            return CommonResult.failed(CommonCodeEnum.INVALID_PARAM);
        }
        QueryWrapper<SmsVisitorRegister> queryWrapper = new QueryWrapper<>();
        queryWrapper.lambda().eq(SmsVisitorRegister::getQrId,smsVisitorRegisterVO.getQrId());
        SmsVisitorRegister query = smsVisitorRegisterMapper.selectOne(queryWrapper);
        if(isNullOrEmpty(query)){
            return CommonResult.failed(CommonCodeEnum.VISITOR_QR_NOT_EXIST);
        }
        if(query.getQrState()==QR_USED){
            return CommonResult.failed(CommonCodeEnum.VISITOR_QR_USED);
        }
        if(query.getRegisterState()!=VISITOR_REGISTER_PROCESS_SUCESS){
            return CommonResult.failed(CommonCodeEnum.VISITOR_QR_PROCESS_ERR);
        }
        SmsVisitorRegister smsVisitorRegister = new SmsVisitorRegister();
        Date date = new Date();//获取当前时间
        if(date.before(query.getEndTime())&&
                date.after(query.getBgTime())
        ){
            smsVisitorRegister.setId(query.getId());
            smsVisitorRegister.setQrUseTime(date);
            //smsVisitorRegister.setQrState(QR_USED);
            smsVisitorRegister.setScanUserId(scan_user_id);
            smsVisitorRegisterMapper.updateById(smsVisitorRegister);
            return CommonResult.success(query.getId());
        }
        else {
            smsVisitorRegister.setQrState(QR_USED);
            return CommonResult.failed(CommonCodeEnum.VISITOR_QR_SCAN_ERR);
        }


    }

    @Override
    public ResponseResult selectSmsVisitorRegisterByQrId(String qrId) {
        QueryWrapper<SmsVisitorRegister> queryWrapper = new QueryWrapper<>();
        queryWrapper.lambda().eq(SmsVisitorRegister::getQrId,qrId);
        SmsVisitorRegister query = smsVisitorRegisterMapper.selectOne(queryWrapper);
        if(isNullOrEmpty(query)){
            return CommonResult.failed(CommonCodeEnum.DATA_NOT_FOUND);
        }
        SmsVisitorRegister smsVisitorRegister = new SmsVisitorRegister();
        smsVisitorRegister.setQrId(qrId);
        SmsVisitorRegisterDTO smsVisitorRegisterDTO = new SmsVisitorRegisterDTO();
        BeanUtils.copyProperties(query,smsVisitorRegisterDTO);
        return CommonResult.success(smsVisitorRegisterDTO);
    }

    @Override
    public ResponseResult selectSmsVisitorRegisterById(String id) {
        SmsVisitorRegister query = smsVisitorRegisterMapper.selectById(id);
        if(isNullOrEmpty(query)){
            return CommonResult.failed(CommonCodeEnum.DATA_NOT_FOUND);
        }
        SmsVisitorRegister smsVisitorRegister = new SmsVisitorRegister();
        smsVisitorRegister.setId(id);

        SmsVisitorRegisterDTO smsVisitorRegisterDTO = new SmsVisitorRegisterDTO();

        BeanUtils.copyProperties(query,smsVisitorRegisterDTO);
        return CommonResult.success(smsVisitorRegisterDTO);
    }

    @Override
    public ResponseResult selectSmsVisitorRegisterByPhone(String phone_num) {
        List<SmsUserDTO> list1 = new ArrayList<>();
        QueryWrapper<SmsUser> queryWrapper1 = new QueryWrapper<>();
        queryWrapper1.lambda().eq(SmsUser::getTel,phone_num);
        queryWrapper1.lambda().eq(SmsUser::getFlag,0);
        SmsUser smsUser = smsUserMapper.selectOne(queryWrapper1);
        if(isNullOrEmpty(smsUser)){
            return CommonResult.success(list1,0);
        }

        List<SmsUser> list = smsUserMapper.selectList(queryWrapper1);
        if(isNullOrEmpty(list)||list.size()==0){
            return CommonResult.success(list1,0);
        }
        for(SmsUser smsUser1:list){
            SmsUserDTO smsUserDTO = new SmsUserDTO();
            BeanUtils.copyProperties(smsUser1,smsUserDTO);
            list1.add(smsUserDTO);
        }

        return CommonResult.success(list1);

    }

    @Override
    public ResponseResult selectSmsVisitorRegisterByBaoAn(String scan_user_id, Integer pageSize, Integer pageNum) {
        List<SmsVisitorRegisterDTO> list1 = new ArrayList<>();
        QueryWrapper<SmsVisitorRegister> queryWrapper = new QueryWrapper<>();
        queryWrapper.lambda().eq(SmsVisitorRegister::getScanUserId,scan_user_id);

        queryWrapper.orderByDesc("create_time");
        Page<SmsVisitorRegister> page = new Page<>(pageNum,pageSize);
        smsVisitorRegisterMapper.selectPage(page,queryWrapper);
        List<SmsVisitorRegister> list = page.getRecords();
        if(list.size()==0||isNullOrEmpty(list)){
            return CommonResult.success(list1,0);
        }
        for(SmsVisitorRegister register:list){
            SmsVisitorRegisterDTO smsVisitorRegisterDTO = new SmsVisitorRegisterDTO();
            BeanUtils.copyProperties(register,smsVisitorRegisterDTO);
            //获取访客用户信息
            SmsVisitorUser smsVisitorUser = smsVisitorUserMapper.selectById(register.getUserId());
            if(!isNullOrEmpty(smsVisitorUser)){
                SmsVisitorUserToScanDTO smsVisitorUserToScanDTO = new SmsVisitorUserToScanDTO();
                BeanUtils.copyProperties(smsVisitorUser,smsVisitorUserToScanDTO);
                smsVisitorRegisterDTO.setSmsVisitorUserToScanDTO(smsVisitorUserToScanDTO);
            }

            list1.add(smsVisitorRegisterDTO);
        }
        int total = (int) page.getTotal();
        return CommonResult.success(list1,total);
    }

    @Override
    public ResponseResult selectById(String id, Integer pageSize, Integer pageNum) {

        QueryWrapper<SmsVisitorRegisterDetail> queryWrapper1 = new QueryWrapper<>();
        SmsVisitorRegister register = smsVisitorRegisterMapper.selectById(id);
        if (isNullOrEmpty(register)) {
            return CommonResult.failed(CommonCodeEnum.DATA_NOT_FOUND);
        }
        SmsVisitorRegisterDTO smsVisitorRegisterDTO = new SmsVisitorRegisterDTO();
        queryWrapper1.lambda().eq(SmsVisitorRegisterDetail::getRegisterId, register.getId());
        List<SmsVisitorRegisterDetail> list1 = smsVisitorRegisterDetailMapper.selectList(queryWrapper1);
        List<SmsVisitorRegisterDetailDTO> detailDTOList = new ArrayList<>();
        if (!isNullOrEmpty(list1) && list1.size() > 0) {
            for (SmsVisitorRegisterDetail registerDetail : list1) {
                SmsVisitorRegisterDetailDTO smsVisitorRegisterDetailDTO = new SmsVisitorRegisterDetailDTO();
                smsVisitorRegisterDetailDTO.setVisitorState(registerDetail.getVisitorState());
                smsVisitorRegisterDetailDTO.setSort(registerDetail.getSort());

                    SmsUser smsUser = smsUserMapper.selectById(registerDetail.getCheckId());
                    smsVisitorRegisterDetailDTO.setPicHead(smsUser.getUserPic());
                    smsVisitorRegisterDetailDTO.setAllowerName(smsUser.getRealName());
                    if(smsVisitorRegisterDetailDTO.getVisitorState().equals(VISITOR_REGISTER_PROCESS_LOSS)){
                        smsVisitorRegisterDetailDTO.setProcessTime(new Date());
                    }

                detailDTOList.add(smsVisitorRegisterDetailDTO);
            }

            BeanUtils.copyProperties(register, smsVisitorRegisterDTO);
            smsVisitorRegisterDTO.setDetailList(detailDTOList);

        }

        return CommonResult.success(smsVisitorRegisterDTO);
    }

    @Override
    public ResponseResult selectSmsVisitorRegisterOfWeb(Integer pageSize, Integer pageNum) {
        QueryWrapper<SmsVisitorRegister> queryWrapper = new QueryWrapper<>();
        //queryWrapper.lambda().eq(SmsVisitorRegister::getIsDeleted, UNDELETE);
        queryWrapper.orderByDesc("create_time");
        Page<SmsVisitorRegister> page = new Page<>(pageNum, pageSize);
        smsVisitorRegisterMapper.selectPage(page, queryWrapper);
        List<SmsVisitorRegister> list = page.getRecords();
        int total = (int) page.getTotal();
        return CommonResult.success(list, total);
    }

    @Override
    public ResponseResult selectByProcessPeople(String visitor_name, String user_id, Integer pageSize, Integer pageNum, String bg_date, String end_date) {
        QueryWrapper<SmsVisitorRegister> queryWrapper = new QueryWrapper<>();
        queryWrapper.lambda().eq(SmsVisitorRegister::getRegisterState, VISITOR_REGISTER_PROCESS_LOOKING);
        List<SmsVisitorRegister> list = smsVisitorRegisterMapper.selectList(new QueryWrapper<>());
        List<String> registerIDList = list.stream().map(SmsVisitorRegister::getId).collect(Collectors.toList());

        List<String> roleIDList = cacheUtil.getRoleList(user_id);
        List<SmsVisitorRegisterDTO> registerDTOList = new ArrayList<>();
        int total = 0;
        if (isNullOrEmpty(list) || list.size() == 0) {
            return CommonResult.success(registerDTOList, total);
        }

        List<String> roleRegisterIDList = new ArrayList<>();
        List<String> personRegisterIDList = new ArrayList<>();
        if (!isNullOrEmpty(roleIDList) && roleIDList.size() > 0) {
            QueryWrapper<SmsVisitorRegisterDetail> roleQueryWrapper = new QueryWrapper<>();
            roleQueryWrapper
//                    .select("DISTINCT register_id")
                    .lambda()
                    .eq(SmsVisitorRegisterDetail::getVisitorState, VISITOR_REGISTER_PROCESS_LOOKING)
                    .eq(SmsVisitorRegisterDetail::getCheckType, PROCESS_ROLE_CHECK_TYPE);

            if (!isNullOrEmpty(registerIDList) && registerIDList.size() > 0) {
                roleQueryWrapper.lambda().in(SmsVisitorRegisterDetail::getRegisterId, registerIDList);
            }
            roleQueryWrapper.lambda().in(SmsVisitorRegisterDetail::getCheckId, roleIDList);

            List<SmsVisitorRegisterDetail> registerDetailList = smsVisitorRegisterDetailMapper.selectList(roleQueryWrapper)
                    .stream()
                    .filter(detail-> {
                        Integer sort = detail.getSort();
                        if(sort==1){
                            return true;
                        }
                        QueryWrapper<SmsVisitorRegisterDetail> query = new QueryWrapper<>();
                        query.lambda()
                                .eq(SmsVisitorRegisterDetail::getRegisterId,detail.getRegisterId())
                        .eq(SmsVisitorRegisterDetail::getSort,detail.getSort()-1);
                        SmsVisitorRegisterDetail smsVisitorRegisterDetail = smsVisitorRegisterDetailMapper.selectOne(query);
                        if(smsVisitorRegisterDetail.getVisitorState()==VISITOR_REGISTER_PROCESS_LOOKING){
                            return false;
                        }
                        return true;
                    })
                    .collect(Collectors.toList());
            roleRegisterIDList = registerDetailList.stream().map(SmsVisitorRegisterDetail::getRegisterId).distinct().collect(Collectors.toList());

        }

        QueryWrapper<SmsVisitorRegisterDetail> personQueryWrapper = new QueryWrapper<>();
        personQueryWrapper
//                .select("DISTINCT register_id")
                .lambda()
                .eq(SmsVisitorRegisterDetail::getVisitorState, VISITOR_REGISTER_PROCESS_LOOKING)
                .eq(SmsVisitorRegisterDetail::getCheckType, PROCESS_PEOPLE_CHECK_TYPE);

        if (!isNullOrEmpty(registerIDList) && registerIDList.size() > 0) {
            personQueryWrapper.lambda().in(SmsVisitorRegisterDetail::getRegisterId, registerIDList);
        }

        personQueryWrapper.lambda().eq(SmsVisitorRegisterDetail::getCheckId, user_id);

        List<SmsVisitorRegisterDetail> personRegisterDetailList = smsVisitorRegisterDetailMapper.selectList(personQueryWrapper)
                .stream()
                .filter(detail-> {
                    Integer sort = detail.getSort();
                    if(sort==1){
                        return true;
                    }
                    QueryWrapper<SmsVisitorRegisterDetail> query = new QueryWrapper<>();
                    query.lambda()
                            .eq(SmsVisitorRegisterDetail::getRegisterId,detail.getRegisterId())
                            .eq(SmsVisitorRegisterDetail::getSort,detail.getSort()-1);
                    SmsVisitorRegisterDetail smsVisitorRegisterDetail = smsVisitorRegisterDetailMapper.selectOne(query);
                    if(smsVisitorRegisterDetail.getVisitorState()==VISITOR_REGISTER_PROCESS_LOOKING){
                        return false;
                    }
                    return true;
                })
                .collect(Collectors.toList());
        personRegisterIDList = personRegisterDetailList.stream().map(SmsVisitorRegisterDetail::getRegisterId).distinct().collect(Collectors.toList());

        List<String> result = new ArrayList<>();
        result.addAll(roleRegisterIDList);
        result.addAll(personRegisterIDList);
        List<String> resultList = result.stream().distinct().collect(Collectors.toList());
        if (isNullOrEmpty(resultList) || resultList.size() == 0) {
            return CommonResult.success(registerDTOList, total);
        }
        Page<SmsVisitorRegister> page = new Page<>(pageNum, pageSize);
        QueryWrapper<SmsVisitorRegister> queryWrapper1 = new QueryWrapper<>();
        queryWrapper1.lambda().in(SmsVisitorRegister::getId, resultList)
                .orderByDesc(SmsVisitorRegister::getCreateTime);
        smsVisitorRegisterMapper.selectPage(page, queryWrapper1);
        total = (int) page.getTotal();
        List<SmsVisitorRegister> list1 = page.getRecords();
        if (!isNullOrEmpty(list1) && list1.size() > 0) {
            for (SmsVisitorRegister register : list1) {
                SmsVisitorRegisterDTO smsVisitorRegisterDTO = new SmsVisitorRegisterDTO();
                BeanUtils.copyProperties(register, smsVisitorRegisterDTO);
                //获取用户信息
                SmsVisitorUser smsVisitorUser = smsVisitorUserMapper.selectById(register.getUserId());
                if(!isNullOrEmpty(smsVisitorUser)){
                    SmsVisitorUserDTO smsVisitorUserDTO = new SmsVisitorUserDTO();
                    BeanUtils.copyProperties(smsVisitorUser,smsVisitorUserDTO);
                    smsVisitorRegisterDTO.setSmsVisitorUserDTO(smsVisitorUserDTO);
                }

                registerDTOList.add(smsVisitorRegisterDTO);

            }
        }

        return CommonResult.success(registerDTOList, total);


    }

    @Override
    public ResponseResult selectSmsVisitorRegisterByAllow(SmsVisitorAllowVO smsVisitorAllowVO, SmsVisitorProcessVO smsVisitorProcessVO,
                                                          String allow_person_id) {
        if (isNullOrEmpty(smsVisitorAllowVO.getRegisterId()) || isNullOrEmpty(smsVisitorAllowVO.getDetailId())) {
            return CommonResult.failed(CommonCodeEnum.INVALID_PARAM);
        }
        SmsVisitorRegister smsVisitorRegister = smsVisitorRegisterMapper.selectById(smsVisitorAllowVO.getRegisterId());
        if (isNullOrEmpty(smsVisitorRegister)) {
            return CommonResult.failed(CommonCodeEnum.DATA_NOT_FOUND);
        }
        QueryWrapper<SmsVisitorRegisterDetail> queryWrapper = new QueryWrapper<>();
        queryWrapper.lambda().eq(SmsVisitorRegisterDetail::getRegisterId, smsVisitorAllowVO.getRegisterId())
                .eq(SmsVisitorRegisterDetail::getId, smsVisitorAllowVO.getDetailId());
        SmsVisitorRegisterDetail smsVisitorRegisterDetail =
                smsVisitorRegisterDetailMapper.selectOne(queryWrapper);
        if (smsVisitorRegister.getRegisterState() == VISITOR_REGISTER_PROCESS_LOOKING) {
            QueryWrapper<SmsVisitorRegisterDetail> queryWrapper1 = new QueryWrapper<>();
            queryWrapper1.lambda().eq(SmsVisitorRegisterDetail::getRegisterId, smsVisitorAllowVO.getRegisterId());
            Integer sortCount = smsVisitorRegisterDetailMapper.selectCount(queryWrapper1);
            if (smsVisitorRegisterDetail.getSort().equals(sortCount)) {
                SmsVisitorRegister smsVisitorRegister1 = new SmsVisitorRegister();
                smsVisitorRegister1.setId(smsVisitorAllowVO.getRegisterId());
                smsVisitorRegister1.setRegisterState(smsVisitorAllowVO.getAllow_state());
                Date date = new Date();
                smsVisitorRegister1.setProcessEndTime(date);
                smsVisitorRegisterMapper.updateById(smsVisitorRegister1);
                SmsVisitorRegisterDetail smsVisitorRegisterDetail1 = new SmsVisitorRegisterDetail();
                smsVisitorRegisterDetail1.setId(smsVisitorAllowVO.getDetailId());
                smsVisitorRegisterDetail1.setVisitorState(smsVisitorAllowVO.getAllow_state());
                smsVisitorRegisterDetail1.setProcessTime(date);
                smsVisitorRegisterDetail1.setAllowerId(allow_person_id);
                smsVisitorRegisterDetailMapper.updateById(smsVisitorRegisterDetail1);
                if(smsVisitorAllowVO.getAllow_state() == ALLOW_REGISTER_PROCESS_SUCESS){
                    //生成二维码
                    String qrId =String.valueOf(date.getTime());
                    smsVisitorRegister1.setQrId(qrId);
                    smsVisitorRegister1.setQrCreateTime(date);
                    smsVisitorRegister1.setId(smsVisitorAllowVO.getRegisterId());
                    smsVisitorRegisterMapper.updateById(smsVisitorRegister1);
                }

            }
            else {
                if (smsVisitorAllowVO.getAllow_state() == ALLOW_REGISTER_PROCESS_LOSS) {
                    SmsVisitorRegister smsVisitorRegister1 = new SmsVisitorRegister();
                    smsVisitorRegister1.setId(smsVisitorAllowVO.getRegisterId());
                    smsVisitorRegister1.setRegisterState(smsVisitorAllowVO.getAllow_state());
                    Date date = new Date();
                    smsVisitorRegister1.setProcessEndTime(date);
                    smsVisitorRegisterMapper.updateById(smsVisitorRegister1);

                    SmsVisitorRegisterDetail smsVisitorRegisterDetail1 = new SmsVisitorRegisterDetail();
                    smsVisitorRegisterDetail1.setId(smsVisitorAllowVO.getDetailId());
                    smsVisitorRegisterDetail1.setVisitorState(smsVisitorAllowVO.getAllow_state());
                    smsVisitorRegisterDetail1.setProcessTime(date);
                    smsVisitorRegisterDetail1.setAllowerId(allow_person_id);

                    smsVisitorRegisterDetailMapper.updateById(smsVisitorRegisterDetail1);
                } else {
                    Date date = new Date();
                    SmsVisitorRegisterDetail smsVisitorRegisterDetail1 = new SmsVisitorRegisterDetail();
                    smsVisitorRegisterDetail1.setId(smsVisitorAllowVO.getDetailId());
                    smsVisitorRegisterDetail1.setVisitorState(smsVisitorAllowVO.getAllow_state());
                    smsVisitorRegisterDetail1.setProcessTime(date);
                    smsVisitorRegisterDetail1.setAllowerId(allow_person_id);
                    smsVisitorRegisterDetailMapper.updateById(smsVisitorRegisterDetail1);

                }

            }

        }
        //写通知
        //判断是否最后流程或是否拒绝
        Boolean is_done = false;
        QueryWrapper<SmsVisitorRegisterDetail> queryWrapper1 = new QueryWrapper<>();
        queryWrapper1.lambda().eq(SmsVisitorRegisterDetail::getRegisterId, smsVisitorAllowVO.getRegisterId());
        Integer sortCount = smsVisitorRegisterDetailMapper.selectCount(queryWrapper1);

        if (smsVisitorRegisterDetail.getSort().equals(sortCount)
                || smsVisitorAllowVO.getAllow_state()==ALLOW_REGISTER_PROCESS_LOSS){
            is_done = true;


//            SmsCommonExamine updateExamine = new SmsCommonExamine();
//            updateExamine.setId(smsCommonExamineReq.getExamineId());
//            updateExamine.setExamineStatus(smsCommonExamineReq.getExamineStatus());
//            updateExamine.setEndTime(nowDate);
//            smsCommonExamineMapper.updateById(updateExamine);
        }

        //消息通知
        boolean result = false;
        if (smsVisitorAllowVO.getAllow_state()==ALLOW_REGISTER_PROCESS_SUCESS){
            result = true;
        }

        if (is_done){
            newTipsUtil.allowFinishTips(smsVisitorRegister.getId(),allow_person_id,result);
        }else{
            QueryWrapper<SmsVisitorRegisterDetail> query = new QueryWrapper<>();
            query.lambda().eq(SmsVisitorRegisterDetail::getRegisterId,smsVisitorAllowVO.getRegisterId());
           List<SmsVisitorRegisterDetail> list = smsVisitorRegisterDetailMapper.selectList(query);
           //获取索引位置为getSort的元素
           SmsVisitorRegisterDetail smsVisitorRegisterDetail1 = list.get(smsVisitorRegisterDetail.getSort());
            //获取下一个审批人id
            RangeTypeEnum rangeTypeEnum;
            if(smsVisitorRegisterDetail1.getCheckType()==PROCESS_ROLE_CHECK_TYPE){
               rangeTypeEnum=RangeTypeEnum.RANGE_TYPE_ENUM_ROLE;
            }
            else {
                rangeTypeEnum=RangeTypeEnum.RANGE_TYPE_ENUM_PERSON;
            }
            List<String> range_id_list = new ArrayList<>();
            range_id_list.add(smsVisitorRegisterDetail1.getCheckId());
            newTipsUtil.allowContinueTips(smsVisitorRegister.getId(),
                    allow_person_id,
                    rangeTypeEnum,
                    range_id_list,
                    smsVisitorRegisterDetail1.getId());

        }
        return CommonResult.success();
    }


}
